Template Methodパターン
スーパークラスで処理の枠組みを定め、サブクラスでその具体的内容を定める。
登場人物
AbstractClass
AbstractDisplayクラスが相当し、テンプレートメソッドを実装またはテンプレートメソッドで使っている抽象メソッドを宣言する。
この抽象メソッドはConcreteClassによって実装される。
ConcreteClass
CharDisplayクラスやStringDiisplayクラスが相当し、AbstractClassで定義されている抽象メソッドを具体的に実装する。
どうしてTemplateMethodを使うのか
スーパークラスのテンプレートメソッドでアルゴリズムが記述されているので、サブクラス側でアルゴリズムをいちいち記述する必要がなくなる。
スーパークラス型の変数があり、その変数にサブクラスのインスタンスが代入されている時、サブクラスの種類を特定せずにプログラムが動作する。
スーパークラス型の変数にサブクラスのインスタンスどれを代入しても正しく動く原則をThe Liskov Substitution Principle(LSP)という。
code:AbstractDisplay.java
public abstract class AbstractDisplay {
public abstract void open();
public abstract void print();
public abstract void close();
public final void display() {
open();
for (int i = 0; i < 5; i++) {
print();
}
close();
}
}
code:CharDisplay.java
public abstract class AbstractDisplay {
public abstract void open();
public abstract void print();
public abstract void close();
public final void display() {
open();
for (int i = 0; i < 5; i++) {
print();
}
close();
}
}
code:StringDisplay.java
public class StringDisplay extends AbstractDisplay {
private String string;
private int width;
public StringDisplay(String string) {
this.string = string;
this.width = string.getBytes().length;
}
public void open() {
printLine();
}
public void print() {
System.out.println("|" + string + "|");
}
public void close() {
printLine();
}
private void printLine() {
System.out.print("+");
for (int i = 0; i < width; i++) {
System.out.print("-");
}
System.out.println("+");
}
}
code:Main.java
public class Main {
public static void main(String[] args) {
AbstractDisplay d1 = new CharDisplay('H');
AbstractDisplay d2 = new StringDisplay("Hello, world.");
AbstractDisplay d3 = new StringDisplay("����ˤ��ϡ�");
d1.display();
d2.display();
d3.display();
}
}
関連しているパターン